/***********************************************************************
	filename: 	CEGUIAnimatesetManager.h
	created:	21/2/2004
	author:		Paul D Turner
	
	purpose:	Defines interface for AnimatesetManager object
*************************************************************************/
/***************************************************************************
 *   Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
 *
 *   Permission is hereby granted, free of charge, to any person obtaining
 *   a copy of this software and associated documentation files (the
 *   "Software"), to deal in the Software without restriction, including
 *   without limitation the rights to use, copy, modify, merge, publish,
 *   distribute, sublicense, and/or sell copies of the Software, and to
 *   permit persons to whom the Software is furnished to do so, subject to
 *   the following conditions:
 *
 *   The above copyright notice and this permission notice shall be
 *   included in all copies or substantial portions of the Software.
 *
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *   OTHER DEALINGS IN THE SOFTWARE.
 ***************************************************************************/
#ifndef _CEGUIAnimatesetManager_h_
#define _CEGUIAnimatesetManager_h_

#include "CEGUIBase.h"
#include "CEGUIString.h"
#include "CEGUISingleton.h"
#include "CEGUIIteratorBase.h"
#include <map>


#if defined(_MSC_VER)
#	pragma warning(push)
#	pragma warning(disable : 4275)
#	pragma warning(disable : 4251)
#endif


// Start of CEGUI namespace section
namespace CEGUI
{
/*!
\brief
	Class providing a shared library of Animateset objects to the system.

	The AnimatesetManager is used to create, access, and destroy Animateset objects.  The idea is that
	the AnimatesetManager will function as a central repository for imagery used within the GUI system,
	and that such imagery can be accessed, via a unique name, by any interested party within the system.
*/
class CEGUIEXPORT AnimatesetManager : public Singleton<AnimatesetManager>
{
public:
	/*!
	\brief
		Constructor for AnimatesetManager objects
	*/
	AnimatesetManager(void);


	/*!
	\brief
		Destructor for AnimatesetManager objects
	*/
	~AnimatesetManager(void);


	/*!
	\brief
		Create a Animateset object with the given name and Texture

		The created Animateset will be of limited use, and will require one or more images to be defined for the set.

	\param name
		String object containing the unique name for the Animateset being created.

	\param texture
		Texture object to be associated with the Animateset

	\return
		Pointer to the newly created Animateset object

	\exception AlreadyExistsException	Thrown if an Animateset named \a name is already present in the system.
	*/
	Animateset*	createAnimateset(const String& name, Texture* texture);

	/*!
	\brief
		Create an Animateset object from the specified file

	\param filename
		String object holding the name of the Animateset definition file which should be used to create the Animateset

    \param resourceGroup
        Resource group identifier to be passed to the resource manager.  NB: This affects the
        imageset xml file only, the texture loaded may have its own group specified in the XML file.

	\return
		Pointer to the newly created Animateset object

	\exception	AlreadyExistsException	Thrown if an Animateset named \a name is already present in the system.
	\exception	FileIOException			Thrown if something goes wrong while processing the file \a filename.
	*/
	Animateset*	createAnimateset(const String& filename, const String& resourceGroup = "");

	/*!
	\brief
		Destroys the Animateset with the specified name

	\param name
		String object containing the name of the Animateset to be destroyed.  If no such Animateset exists, nothing happens.

	\return
		Nothing.
	*/
	void	destroyAnimateset(const String& name);

	/*!
	\brief
		Destroys the given Animateset object

	\param imageset
		Pointer to the Animateset to be destroyed.  If no such Animateset exists, nothing happens.

	\return
		Nothing.
	*/
	void	destroyAnimateset(Animateset* imageset);


	/*!
	\brief
		Destroys all Animateset objects registered in the system

	\return
		Nothing
	*/
	void	destroyAllAnimatesets(void);


	/*!
	\brief
		Returns a pointer to the Animateset object with the specified name

	\param name
		String object containing the name of the Animateset to return a pointer to

	\return
		Pointer to the requested Animateset object

	\exception	UnknownObjectException	Thrown if no Animateset named \a name is present in within the system
	*/
	Animateset*	getAnimateset(const String& name) const;


	/*!
	\brief
		Check for the existence of a named Animateset

	\param name
		String object containing the name of the Animateset to look for

	\return
		true if an Animateset named \a name is presently loaded in the system, else false.
	*/
	bool	isAnimatesetPresent(const String& name) const			{return d_animatesets.find(name) != d_animatesets.end();}


	/*!
	\brief
		Notify the AnimatesetManager of the current (usually new) display resolution.

	\param size
		Size object describing the display resolution

	\return
		Nothing
	*/
	void	notifyScreenResolution(const Size& size);


    /*!
    \brief
        Writes a full XML imageset for the specified Animateset to the given OutStream.

    \param imageset
        String holding the name of the Animateset to be written to the stream.

    \param out_stream
        OutStream (std::ostream based) object where data is to be sent.

    \return
        Nothing.
    */
    void writeAnimatesetToStream(const String& imageset, OutStream& out_stream) const;


private:
	/*************************************************************************
		Implementation Data
	*************************************************************************/
	typedef	std::map<String, Animateset*, String::FastLessCompare>		AnimatesetRegistry;
	AnimatesetRegistry	d_animatesets;

public:
	/*************************************************************************
		Iterator stuff
	*************************************************************************/
	typedef	ConstBaseIterator<AnimatesetRegistry>	AnimatesetIterator;

	/*!
	\brief
		Return a AnimatesetManager::AnimatesetIterator object to iterate over the available Animateset objects.
	*/
	AnimatesetIterator	getIterator(void) const;
};

} // End of  CEGUI namespace section

#if defined(_MSC_VER)
#	pragma warning(pop)
#endif

#endif	// end of guard _CEGUIImageSetManager_h_
